package com.ruijie.acl.service;

import java.util.List;
import com.ruijie.acl.AccessGroup;
import com.ruijie.acl.AclDevice;
import com.ruijie.acl.TimeInfo;
import com.ruijie.acl.TimeRange;
import com.ruijie.emp.device.Device;
import com.ruijie.foundation.annotation.DomainService;
import com.ruijie.foundation.dao.support.Page;
import com.ruijie.foundation.service.Repository;
/**
 * <p>
 * Title: ACL时间段接口类
 * </p>
 * <p>
 * Description: 为ACL时间段模块提供逻辑处理，以及数据库的操作。
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: Ruijie Co., Ltd.
 * </p>
 * <p>
 * Create Time: 
 * </p>
 * <p>
 * Update Time:
 * </p>
 * <p>
 * Updater:
 * </p>
 * <p>
 * Update Comments:
 * </p>
 * 
 * @author ASAI
 */
@DomainService
public interface TimeRangeService extends Repository<TimeRange> {
	/**
	 * 分页查询时间段
	 * @param timeRange 时间段
	 * @param pageNo 页数
	 * @param pageSize 每面显示的记录数
	 * @return 时间段
	 */
	public Page pageQueryByTimeRange(TimeRange timeRange,int pageNo,int pageSize);
	
	/**
	 * 时间段名称重复验证
	 * @param name 
	 * @param id
	 * @return
	 */
	public boolean isExistTimeRangeName(String name,Long id);
	
	/**
	 * 根据名称取得ACL时间段信息
	 * 
	 * @param name ACl时间段名称
	 * 
	 * @return List 时间段信息
	 */
	public List<TimeRange> getByName(String name); 
	
	/**
	 * 根据名称取得有ACL设备的ACL时间段信息
	 * 
	 * @param name
	 *            ACL时间段名称
	 * @param aclDevice
	 *            ACL设备
	 * 
	 * @return List 时间段信息
	 */
	public TimeRange getByNameWithAclDevice(String name, AclDevice aclDevice);
	
	/**
	 * 根据名称取得无ACL设备的ACL时间段信息
	 * 
	 * @param name
	 *            ACl时间段名称
	 * 
	 * @return List 时间段信息
	 */
	public TimeRange getByNameWithoutAclDevice(String name);
	
	/**
	 * 判断时间段是否与设备关联
	 * @param entity
	 * @return
	 */
	public boolean isRelated2Device(TimeRange entity);
	
	/**
	 * <p>根据ID字符串取得时间段信息</p>
	 * <p>ID字符串使用逗号(,)分隔</p> 
	 * @return 时间段信息列表
	 */
	public List<TimeRange> findByIds(String ids);
	/**
	 * <p>根据ID数组取得时间段信息</p>
	 * @return 时间段信息列表
	 */
	public List<TimeRange> findByIds(Long[] ids);
	
	/**
	 * 根据ACL组获取相关联的时间段
	 * @param accessGroup
	 * @return
	 */
	public List<TimeRange> findByAccessGroup(AccessGroup accessGroup);
	/**
	 * 根据ACL组列表获取相关联的时间段列表
	 * @param accessGroups ACL组列表
	 * @return 时间段列表
	 */
	public List<TimeRange> findByAccessGroup(List<AccessGroup> accessGroups);
	
	/**
	 * 通过时间段获得device的ids
	 * @param entity 时间段
	 * @return device ids
	 */
	public List<Device> getDevices(TimeRange entity);
	
	/**
	 * 通过时间段获得AccessGroup的ids或name
	 * @param entity 时间段
	 * @param isDelete 是否删除
	 * @return
	 */
	public String getAccessGroups(TimeRange entity,boolean isDelete);
	
	/**
	 * 通过时间段获得AccessGroup
	 * @param entity 时间段
	 * @return List<AccessGroup>
	 */
	public List<AccessGroup> getAccessGroupList(TimeRange entity);
		
	/**
	 * 时间段详细界面的单设备部署
	 * @param id
	 * @param device
	 */
	public void reConfig(TimeRange timeRange,Device device,String dealFlag);
	
	/**
	 * 时间段是否关联规则
	 * @param entity
	 * @return
	 */
	public boolean isExitesAce(TimeRange entity);
	
	/**
	 * 保存与指定时间段列表且包含指定设备对应的ACL设备的时间段
	 * @param entityList 时间段
	 * @param device 设备
	 */
	public void saveSameWithDevice(List<TimeRange> entityList, Device device);
	
	/**
	 * 保存与指定时间段相同信息且包含ACL设备的时间段
	 * @param entity 时间段
	 * @param aclDevice ACL设备
	 * @param timeInfoList TimeInfo列表
	 */
	public void saveSameWithAclDevice(TimeRange entity, AclDevice aclDevice, List<TimeInfo> timeInfoList);
	
	/**
	 * 删除与指定时间段对应的设备时间段
	 * @param entity 时间段
	 */
	public void removeWithAclDevice(TimeRange entity);
	
	/**
	 * 取得系统ACL时间段信息
	 * 
	 * @param name
	 *            ACl时间段名称
	 * 
	 * @return List 时间段信息
	 */
	public List<TimeRange> getWithoutAclDevice();
	
	/**
	 * 更新时间段的修改标志位
	 * @param list 时间段列表
	 */
	public void updateChangeFlag(List<TimeRange> list);
	/**
	 * 更新时间段修改标志位
	 * @param entity 时间段
	 */
	public void updateChangeFlag(TimeRange entity);
	
	public boolean isExitesAce(TimeRange entity,AclDevice aclDevice);
	
	/**
	 * 取得包含指定ACL设备的时间段列表
	 * @param aclDevice ACL设备
	 * @return 时间段列表
	 */
	public List<TimeRange> getByAclDevice(AclDevice aclDevice);
}
